// 解释
// 特殊情况处理：
// 如果 numRows 为 1 或 numRows 大于等于字符串长度，直接返回原字符串。
// 初始化结果数组：
// 创建一个包含 Math.min(numRows, s.length) 个空字符串的数组 rows，用于存储每一行的字符。
// 遍历字符串：
// 使用 currentRow 变量记录当前字符所在的行。
// 使用 goingDown 变量记录当前方向（向下或向上）。
// 遍历字符串 s，将每个字符添加到相应的行中。
// 当 currentRow 为 0 或 numRows - 1 时，改变方向。
// 生成结果字符串：
// 将 rows 中的所有字符串连接起来，形成最终的输出字符串。

function convert(s, numRows) {
  if (numRows === 1 || numRows >= s.length) {
    return s
  }

  const rows = new Array(Math.min(numRows, s.length)).fill('')
  let currentRow = 0
  let goingDown = false

  for (const char of s) {
    rows[currentRow] += char
    if (currentRow === 0 || currentRow === numRows - 1) {
      goingDown = !goingDown
    }
    currentRow += goingDown ? 1 : -1
  }

  return rows.join('')
}

// 示例测试
console.log(convert('PAYPALISHIRING', 3)) // 输出: "PAHNAPLSIIGYIR"
